Skip to main content

Nesne Yönelimli Programlama (OOP)

Sınıflar:

Nesne yönelimli programlama, nesnelerin ve sınıfların üzerine kuruludur. Sınıflar, nesneleri oluşturmak için kullanılan yapılar olup, nesnelerin özelliklerini (attribute) ve davranışlarını (method) tanımlarlar.

Not:

Fonksiyonları tanımlamak için def anahtar sözcüğünü kullanırken, sınıfları tanımlamak için class anahtar sözcüğünü kullanırız. class ifadesinin ardından gelen isim, o sınıfın adını temsil eder.

Fonksiyonların aksine, bir sınıf tanımlandıktan sonra, sınıftan bir örnek (instance) oluşturulmadığı sürece, o sınıfın hiçbir işlevi çalıştırılmaz.

class ÇalışanSınıfı():
pass # Boş bir sınıf tanımladık.
class Ogrenci:
isim = "Mehmet"
soyisim = "Yıldırım"
yas = 12
not_ort = 90
print(Ogrenci.isim) # Sınıf niteliğine erişim.

Mehmet

Ogrenci.yas = 25
print(Ogrenci.yas) # Sınıf niteliğine değer atayarak değiştirdik.

25

ogrenci1 = Ogrenci() # Sınıftan bir örnek oluşturduk (instantiation).

Not:

ogrenci1 örneği, Ogrenci sınıfından türetilmiştir. Bu işleme teknik dilde ‘örnekleme’ veya ‘örneklendirme’ (instantiation) adı verilir.

print(ogrenci1.isim) # Sınıf örneğinin niteliğine erişim.

'Mehmet'

ogrenci2 = Ogrenci()
ogrenci2.isim = "Ali"
print(ogrenci2.isim) # Sınıf örneğinin niteliğini değiştirdik.

'Ali'

print(ogrenci2.not_ort) # Sınıf örneğinin başka bir niteliğine erişim.

90

class Ogrenci:
def __init__(self, isim, soyisim, yas, not_ort): # Sınıfın yapıcı (initializer) metodu.
self.nesne_ismi = isim
self.nesne_soyismi = soyisim
self.nesnenin_yasi = yas
self.nesnenin_not_ort = not_ort

Initializer or Constructor __init__:

  • Constructor (Yapıcı) Metod, bir sınıfın örneği oluşturulduğunda otomatik olarak çağrılan ve örneğin başlangıç durumunu ayarlayan özel bir metottur.
  • Bu metod, sınıfın özelliklerine başlangıç değerleri atamak için kullanılır.
class Araba:
def __init__(self, marka, model, renk):
print("Constructor çalıştı")
self.marka = marka
self.model = model
self.renk = renk

araba1 = Araba("Ford", "Mustang", "Mavi") # Araba sınıfından bir örnek oluşturuyoruz.

print(araba1.marka)
print(araba1.model)
print(araba1.renk)

Constructor çalıştı
Ford
Mustang
Mavi

Self:

  • self, sınıfın kendisini temsil eder ve bir sınıfın örneğini temsil eden bir referanstır.
  • self, sınıf içindeki diğer metodlara ve niteliklere (değişkenlere) erişim sağlar.

python
class Matematik:
def topla(self, sayi1, sayi2):
return sayi1 + sayi2
def cikar(self, sayi1, sayi2):
return sayi1 - sayi2
def carp(self, sayi1, sayi2):
return sayi1 * sayi2
def bol(self, sayi1, sayi2):
return sayi1 / sayi2
matematik = Matematik() # Matematik sınıfından bir örnek oluşturuyoruz.

Burada Matematik sınıfı, temel matematik işlemlerini gerçekleştiren metotlara sahiptir ve self anahtar kelimesi sayesinde bu metotlar, sınıfın özelliklerine erişebilir.

Matematik Sınıfı ve İşlemleri

Nesne yönelimli programlamada, Matematik sınıfı gibi yapılar, işlevsellikleri ve verileri tek bir yapı altında gruplamak için kullanılır. Bu yapı, kodun yeniden kullanılabilirliğini ve organizasyonunu artırır.

print("Toplam = " + str(matematik.topla(2, 5)))

Toplam = 7

Bu örnekte, Matematik sınıfının topla metodunu kullanarak iki sayının toplamını hesaplıyoruz.

class Matematik:
def __init__(self, sayi1, sayi2):
self.sayi1 = sayi1
self.sayi2 = sayi2

def topla(self):
return self.sayi1 + self.sayi2

def cikar(self):
return self.sayi1 - self.sayi2

def carp(self):
return self.sayi1 * self.sayi2

def bol(self):
return self.sayi1 / self.sayi2

Bu sınıf, matematiksel işlemleri gerçekleştiren metodlara sahip bir Matematik sınıfı tanımlar. Her bir metod, sınıfın örneklerine (instances) ait özellikleri (attributes) kullanır.

matematik2 = Matematik(2, 5)

Bu kod, Matematik sınıfından bir örnek oluşturur.

print("Toplam = " + str(matematik2.topla()))

Toplam = 7

Bu kod, Matematik sınıfının bir örneğini kullanarak iki sayının toplamını yazdırır.

Araba Sınıfı ve Metotları

OOP'de, Araba sınıfı gibi yapılar, gerçek dünya nesnelerini modellemek için kullanılır. Sınıfların özellikleri (attributes) ve davranışları (methods) vardır.

class Araba:
# attributes
def __init__(self, marka, model, renk):
self.marka = marka
self.model = model
self.renk = renk

# methods
def tanit(self):
print(f"Araba; {self.marka}, {self.model}, {self.renk} renkte bir arabadır.")

araba1 = Araba("Ford", "Mustang", "Mavi") # Bir Araba örneği oluşturuluyor.
araba1.tanit()

Araba; Ford, Mustang, Mavi renkte bir arabadır.

Bu kod, Araba sınıfının bir örneğini oluşturur ve bu örneğin tanit metodunu kullanarak araba hakkında bilgi yazdırır.

Kitap Sınıfı ve Metotları

Benzer şekilde, Kitap sınıfı da kitapla ilgili bilgileri saklayabilir ve bu bilgilere ilişkin işlemleri gerçekleştirebilir.

class Kitap:
# Attributes
def __init__(self, baslik, yazar, sayfa_sayisi):
self.baslik = baslik
self.yazar = yazar
self.sayfa_sayisi = sayfa_sayisi

# Methods
def tanit(self):
print(f"'{self.baslik}' adlı kitap, {self.yazar} tarafından yazılmıştır.")

def sayfa_ekle(self, sayfa):
self.sayfa_sayisi += sayfa
print(f"{self.baslik} adlı kitaba {sayfa} sayfa eklendi. Toplam sayfa sayısı {self.sayfa_sayisi}")
kitap1 = Kitap("Python Programlama Rehberi", "Ahmet Mehmet", 300)
kitap1.tanit()
kitap1.sayfa_ekle(50)

'Python Programlama Rehberi' adlı kitap, Ahmet Mehmet tarafından yazılmıştır.
Python Programlama Rehberi adlı kitaba 50 sayfa eklendi. Toplam sayfa

sayısı 350

Inheritance - Miras Alma

Miras alma (inheritance), sınıflar arasında kod yeniden kullanılabilirliğini sağlar. Bir sınıf, başka bir sınıfın özelliklerini ve davranışlarını miras alabilir.

class Asker():
def __init__(self, isim, rütbe):
self.isim = isim
self.rütbe = rütbe
self.güç = 100

def hareket_et(self):
print('hareket ediliyor...')

def puan_kazan(self):
print('puan kazanıldı')

def puan_kaybet(self):
print('puan kaybedildi')

# İşçi ve Yönetici sınıfları da benzer şekilde tanımlanabilir ve Asker sınıfının özelliklerini miras alabilir.
asker1 = Asker("Ahmet", "er")
print(asker1.güç)

100

asker1.hareket_et()

hareket ediliyor...

Bu kısımlar, nesne yönelimli programlamanın temel kavramlarını ve Python'da sınıfların nasıl kullanıldığını özetlemektedir.

Base Classes, Super Class

Nesne yönelimli programlamada, taban sınıflar (base classes) veya süper sınıflar (super classes), diğer sınıflar için temel işlevselliği ve özellikleri sağlar. Alt sınıflar (subclasses), bu taban sınıflardan miras alarak bu özellikleri ve metodları kullanabilir ve genişletebilir.

# Taban Sınıf
class Oyuncu:
def __init__(self, isim, rütbe):
self.isim = isim
self.rütbe = rütbe
self.güç = 0

def hareket_et(self):
print('hareket ediliyor...')

def puan_kazan(self):
print('puan kazanıldı')

def puan_kaybet(self):
print('puan kaybedildi')

Yukarıdaki Oyuncu sınıfı, diğer sınıfların miras alabileceği temel bir yapı sağlar.

class Asker(Oyuncu):  # Yukarıdaki taban sınıftan türeyen Alt Sınıf
pass

Asker sınıfı, Oyuncu taban sınıfından miras alır ve Oyuncu sınıfının tüm özelliklerine ve metodlarına erişim sağlar.

asker1 = Asker("Ahmet", "Er")
print(asker1.rütbe)  # 'Er'
print(asker1.güç) # 0
asker1.hareket_et() # 'hareket ediliyor...'

Asker sınıfının bir örneği oluşturulduğunda, Oyuncu sınıfından miras alınan özellikler ve metodlar kullanılabilir.

class İşçi(Oyuncu):
pass

class Yönetici(Oyuncu):
pass

İşçi ve Yönetici sınıfları da, Oyuncu sınıfından miras alır ve bu sınıfın özelliklerini ve metodlarını içerirler.

asker1 = Asker('Ahmet', 'Er')
işçi1 = İşçi('Mehmet', 'Usta')
yönetici1 = Yönetici('Selim', 'Müdür')

Bu kod, Asker, İşçi ve Yönetici sınıflarının örneklerini oluşturur ve bu örnekler üzerinden Oyuncu sınıfından miras alınan metodları çağırabilir.

asker1.hareket_et()  # 'hareket ediliyor...'
işçi1.puan_kaybet() # 'puan kaybedildi'
yönetici1.puan_kazan() # 'puan kazanıldı'

Bu kodlar, miras alınan metodların, alt sınıfların örnekleri üzerinden nasıl kullanılabileceğini gösterir. Miras almanın avantajı, kod tekrarını önlemek ve alt sınıfların, üst sınıfların sağladığı işlevselliği doğrudan kullanabilmesidir.

Miras alınan sınıflar, alt sınıflar tarafından değiştirilebilir (override) veya genişletilebilir. Bu, alt sınıfların, belirli ihtiyaçlara göre özelleştirilmesini sağlar. Ancak, miras alınan sınıfın özelliklerini ve metodlarını doğrudan değiştirmeden önce, alt sınıfın gerçekten bu değişikliklere ihtiyaç duyup duymadığını dikkatlice değerlendirmek önemlidir.

Miras Alınan Sınıfın Bütün Nitelik ve Metotları Alt Sınıfa Olduğu Gibi Devredilir.

Bir alt sınıf, üst sınıftan tüm özellik ve metotları miras alır. Bu, alt sınıfın üst sınıfın tüm işlevlerine ve verilerine sahip olduğu anlamına gelir.

class Asker(Oyuncu):
pass

Bu durumda, Asker sınıfı, Oyuncu sınıfından tüm özellikleri ve metotları miras alır.

Miras Alınan Sınıfın Bazı Nitelik ve Metotları Alt Sınıfta Yeniden Tanımlanır.

Alt sınıflar, bazen üst sınıfın özelliklerini veya metotlarını değiştirmek ister. Bu durumda, alt sınıf üst sınıfın metotlarını veya özelliklerini override edebilir.

class Asker(Oyuncu):
memleket = "Konya"

Bu örnekte, Asker sınıfı Oyuncu sınıfından miras alırken, aynı zamanda memleket isimli yeni bir özellik eklemiştir.

asker = Asker("Ahmet", "Binbaşı")
print(asker.memleket) # 'Konya'

Asker sınıfının bir örneği oluşturulduğunda, bu yeni özellik kullanılabilir.

Super()

super() fonksiyonu, bir alt sınıfın üst sınıfının metotlarını ve özelliklerini çağırmasını sağlar. Bu, özellikle alt sınıfın üst sınıfın __init__ metodunu çağırması gerektiğinde önemlidir.

class Asker(Oyuncu):
def __init__(self, isim, rütbe):
super().__init__(isim, rütbe) # Üst sınıfın __init__ metodunu çağırır.
self.güç = 100 # Ek özellikler ekler.

Bu örnekte, Asker sınıfı, Oyuncu sınıfının __init__ metodunu super() ile çağırarak isim ve rütbe özelliklerini miras alır ve ek olarak güç özelliğini tanımlar.

asker = Asker("Ahmet", "Binbaşı")
print(asker.isim) # 'Ahmet'
print(asker.rütbe) # 'Binbaşı'
print(asker.güç) # 100

Asker sınıfının bir örneği oluşturulduğunda, Oyuncu sınıfından miras alınan özelliklere ek olarak güç özelliği de atanmış olur.

Özel Durumlar ve Genişletmeler

Alt sınıflar, miras aldıkları metotları yeniden tanımlayarak özelleştirebilir. Bu, alt sınıfların belirli ihtiyaçlarını karşılamak için üst sınıfın işlevselliğini genişletmesine olanak tanır.

class Asker(Oyuncu):
def __init__(self, isim, rütbe):
super().__init__(isim, rütbe)
self.güç = 100

def hareket_et(self):
super().hareket_et()
print('hedefe ulaşıldı.')

Bu kod, Asker sınıfının hareket_et metodunu Oyuncu sınıfının metodunu çağırarak ve ek bir mesaj yazdırarak genişletir.

asker2 = Asker("Mehmet", "Er")
asker2.hareket_et() # 'hareket ediliyor...' ve 'hedefe ulaşıldı.'

Asker sınıfı, Oyuncu sınıfının hareket_et metodunu gen

işleterek, askerin hareket ettiğini ve hedefe ulaştığını belirten ek çıktılar üretir.